package com.chenziwen.scala.chapter06

object Scala_Trait4 {
  def main(args: Array[String]): Unit = {

    // 特质的构造器执行的顺序
    // Operate4...
    // Data4...
    // DB4...
    // File4...

    // 同时混入多个特质，称之为叠加
    // Scala在叠加特质的时候，会首先从后面的特质开始执行
    // Scala中特质如果调用super，并不是表示调用父特质的方法，而是向前面（左边）继续查找特质，如果找不到，才会去父特质查找
    val mysql1 = new MYSQL4 with File4 with DB4
    // 输出：向数据库向文件向数据库 = 4
    mysql1.insert(4)

    val mysql2 = new MYSQL4 with DB4 with File4
    // 输出：向数据库向文件向数据库 = 4
    mysql2.insert(4)
  }
}

trait Operate4 {
  println("Operate4...")

  def insert(id: Int)
}

trait Data4 extends Operate4 {
  println("Data4...")

  override def insert(id: Int): Unit = {
    println("向数据库 = " + id)
  }
}

trait DB4 extends Data4 {
  println("DB4...")

  override def insert(id: Int): Unit = {
    print("向数据库")
    super.insert(id)
  }
}

trait File4 extends Data4 {
  println("File4...")

  override def insert(id: Int): Unit = {
    print("向文件")
    super.insert(id)
  }
}

class MYSQL4 {

}